<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>
    第七课.
    JavaScript内置对象.
    包装类型.
    字符串三大操作.
    正则表达式
  </title>
</head>
<body>

<!-- ----------------------------- -->
❤ JavaScript内置对象? 由浏览器实现的ECMAScript定义好的标准对象 :内置对象封装了专门的数据，和数据操作常用的API
String Boolean Number Array Date Math Erro Function Object Global

❤ 包装类型：专门封装原始类型的数据，并提供对数据常用操作的内置类型
string Number Boolean
<!-- ----------------------------- -->


* 所有的字符串API 都需要接受返回值 *
String 包装类：字符一旦创建，不可改变

str.length:返回字符串的个数
str[i] 字符串也是一个数组
* 大量+=符串时，用数组代替 .push() .join(''); 优化
str+'' 比tostring()性能更好


大小写转换 (验证邮箱，验证码，浏览器标识...)
小写 str = str.toLowerCase();
大写 str = str.toUpperCase();

获取指定位置的字符
var char = str.charAt(index); // @example str.charAt(str.length-1) 最后一个

字符串三大操作
1.查找关键字，2.替换关键字，3.获取子字符串

str.indexOf('关键字',开始查找的位置);
str.lastIndexOf('关键字',从最后向前找);

获取子字符串
var subStr = str.slice(start, end+1); 可以用负数倒数
= str.substring(start, end+1); 兼容其他语言不可用负数
= str.substr(start, count);

分割字符串
var str = str.split(' ') 靠什么分割字符


<!-- ---------------------------------------- -->
unicode范围
48-57：0-9 数字字符
65-90：A-Z 大写字母
97-122：a-z 小写字母
19968-40869：汉字
<!-- ---------------------------------------- -->


正则表达式：
var reg = /μ/ig // i忽略大小写 g全局匹配

替换字符串
var str = str.replace(reg,'μ');

获取关键字的内容 *如果未找到返回null;
var words = str.match(reg); @example if(str.match(reg)){}

正则：
[所有备选字符]：必须多选一 只能匹配一位字符 @example /[]/
[^μ]：除了μ的匹配 必须放在[]中的第一个位置
- 字符范围：[0-9],[a-z],[a-ZA-Z],
汉字编码: [\u4e00-\u9fa5]

预定义字符集：使用简化的字符定义常用字符集
example:
\d = [0-9] ;
\w = [a-zA-Z0-9_];
\s = 空字符
.  = 一个任意字符  （\.表示.）
数量词：规定前面字符出现次数的量词
语法 {min,max}

@example 测试一个手机号 /\+86\s1[3576]\d{9}/



<script>
  // @example 来来一个验证码
  function doe(code) {
    var input = '';
    while ((input = prompt('验证码：' + code).toLowerCase()) != code.toLowerCase()) {
      alert('错误' + input);
    }
    alert('成功' + input);
  }
  //doe('5AsD');

  // @example 字符串转数组操作
  function charCode(input) {
    var result = [];
    for (var i = 0; i < input.length; i++) {
      var num = input.charCodeAt(i);
      if (num < 10000) {
        //var arr = [0, 0, 0, 0, 0];
        //var code = num + '';
        //var start = 5 - code.length;
        //for (var n = 0; n < code.length; n++) {
        //  arr[start] = code[n];
        //  start++;
        //}
        //num = arr.join('');
        num = num + 10000 + '';
        num = '0' + num.slice(1);
      }
      result.push(num);
    }
    return result.join('');
  }
  //  console.log(charCode('今天dd504'));

  function fromCode(input) {
    var arr = [];
    for (var i = 0; i < input.length; i += 5) {
      var code = input.substring(i, i + 5);
      arr.push(String.fromCharCode(code));
    }
    return arr.join('');
  }
  //  console.log(fromCode(charCode('今天dd504')));

  // @example 查找某个值
  function inof() {
    var str = '女神说要来，我草草的收拾了房间，结果她又说不来了，我说：我草';
    var index = -1; // lastIndexOf =length
    while ((index = str.indexOf('我草', index + 1)) != -1) {
      console.log(index);
    }
  }

  // @example 分割字符
  function words(sea) {
    var word = sea.split(' ');
    for (var i = 0; i < word.length; i++) {
      word[i] = word[i][0].toUpperCase() + word[i].substring(1);
    }
    return word.join(' ');
  }
  console.log(words('no zuo no die, why you try'));


</script>
</body>
</html>